package br.com.ruidobrasil.manterpublicacao {
	
	import br.com.ruidobrasil.util.TratamentoErros;
	import br.com.ruidobrasil.util.componentes.upload.Imagem;
	import br.com.ruidobrasil.util.componentes.upload.UploadEvent;
	import br.com.ruidobrasil.vo.PublicacaoVO;
	
	import flash.events.Event;
	import flash.events.MouseEvent;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.controls.Label;
	import mx.events.CloseEvent;
	import mx.events.FlexEvent;
	import mx.events.ListEvent;
	import mx.managers.PopUpManager;
	import mx.rpc.events.FaultEvent;
	import mx.rpc.events.ResultEvent;
	
	public class PublicacaoEdicao extends PublicacaoEdicaoView {
		
		public static const TIPO_PUBLICACAO_SLIDES: String = "SLIDES";
		
		private var _telaPai: PublicacaoSelecao;
		private var _vo: PublicacaoVO;
		private var listaTiposPublicacao: ArrayCollection;
		private var listaPublicacaoAtiva: ArrayCollection;
		private var listaPublicacaoSlide: ArrayCollection;
		private var listaImagensPublicacao: ArrayCollection;
		private var novaVO: PublicacaoVO;
		private var _qtdMaximaUploadImagens: int;
		public var contadorImagens: int;
		
		public function PublicacaoEdicao(vo: PublicacaoVO) {
			super();
			
			_vo = vo;
			this.addEventListener(FlexEvent.CREATION_COMPLETE, init);
		}
		
		private function init(event: FlexEvent): void {
			
			vs.selectedChild = cnvDados;
			
			btnProximoPasso.addEventListener(MouseEvent.CLICK, proximoPasso);
			btnPassoAnterior.addEventListener(MouseEvent.CLICK, passoAnterior);
			btnFinalizar.addEventListener(MouseEvent.CLICK, finalizar);
			btnFechar.addEventListener(MouseEvent.CLICK, fechar);
			cbxTipoPublicacao.addEventListener(ListEvent.CHANGE, verificarTipoPublicacaoSelecionado);
			
			this.addEventListener(UploadEvent.UPLOAD_EVENT, uploadEvent);
			this.addEventListener(CloseEvent.CLOSE, fechar);
			
			rm.obterDados.addEventListener(ResultEvent.RESULT, resultObterDados);
			rm.obterDados.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.incluir.addEventListener(ResultEvent.RESULT, resultIncluir);
			rm.incluir.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.alterar.addEventListener(ResultEvent.RESULT, resultAlterar);
			rm.alterar.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			rm.obterImagensPublicacao.addEventListener(ResultEvent.RESULT, resultObterImagensPublicacao);
			rm.obterImagensPublicacao.addEventListener(FaultEvent.FAULT, TratamentoErros.fault);
			
			limparDados();
			rm.obterDados();
		}
		
		private function resultObterDados(event: ResultEvent): void {
			
			listaTiposPublicacao = event.result.dados.listaTiposPublicacao;
			
			var objTipoPublicacao: PublicacaoVO = new PublicacaoVO();
			objTipoPublicacao.descTipoPublicacao = "---";
			
			listaTiposPublicacao.addItemAt(objTipoPublicacao, 0);
			
			cbxTipoPublicacao.dataProvider = listaTiposPublicacao;
			
			criarComboPublicacaoAtiva();
			
			if (_vo != null) {
				this.alterar();
			} else {
				this.incluir();
			}
		}
		
		private function criarComboPublicacaoAtiva(): void {
			listaPublicacaoAtiva = new ArrayCollection();
			
			var objPublicacao: PublicacaoVO = new PublicacaoVO();
			objPublicacao.bolAtivo = "---";
			listaPublicacaoAtiva.addItemAt(objPublicacao, 0);
			
			var objPubAtiva: PublicacaoVO = new PublicacaoVO();
			objPubAtiva.bolAtivo = "true";
			listaPublicacaoAtiva.addItemAt(objPubAtiva, 1);
			
			var objPubInativa: PublicacaoVO = new PublicacaoVO();
			objPubInativa.bolAtivo = "false";
			listaPublicacaoAtiva.addItemAt(objPubInativa, 2);
			
			cbxPublicacaoAtiva.dataProvider = listaPublicacaoAtiva;
		}
		
		private function fechar(event: Event = null): void {
			PopUpManager.removePopUp(this);
			_telaPai.pesquisar();
		}
		
		private function limparDados(): void {
			txtTitulo.text = "";
			cbxTipoPublicacao.selectedIndex = 0;
			txtResumo.text = "";
			txtTexto.text = "";
			cbxPublicacaoAtiva.selectedIndex = 0;
		}
		
		private function proximoPasso(event: MouseEvent): void {
			
			if (validarDados()) {
				
				novaVO = new PublicacaoVO();
				novaVO.tituloPublicacao = txtTitulo.actualText;
				novaVO.idTipoPublicacao = cbxTipoPublicacao.selectedItem.idTipoPublicacao;
				novaVO.resumoPublicacao = txtResumo.text;
				novaVO.textoPublicacao = txtTexto.text;
				novaVO.bolAtivo = cbxPublicacaoAtiva.selectedItem.bolAtivo;
				
				if (_vo != null && _vo.idPublicacao != null && _vo.idPublicacao != "") {
					novaVO.idPublicacao = _vo.idPublicacao;
					rm.alterar(novaVO);
				} else {
					rm.incluir(novaVO);
				}
				
				vs.selectedChild = vbxAguarde;
			}
		}
		
		private function resultIncluir(event: ResultEvent): void {
			_vo = event.result.dados.vo;
			
			vs.selectedChild = cnvImagens;
			
			obterImagensPublicacao();
		}
		
		private function resultAlterar(event: ResultEvent): void {
			_vo = event.result.dados.vo;
			
			vs.selectedChild = cnvImagens;
			
			obterImagensPublicacao();
		}
		
		private function passoAnterior(event: MouseEvent): void {
			alterar();
		}
		
		private function finalizar(event: MouseEvent): void {
			fechar();
		}
		
		private function validarDados(): Boolean {
			
			var msg: String = "O campo ";
			var validacaoOk: Boolean = true;
			
			if (txtTitulo.text == "") {
				msg += "Título";
				validacaoOk = false;
				
			} else if (cbxTipoPublicacao.selectedIndex == 0) {
				msg += "Tipo de Publicação";
				validacaoOk = false;
				
			} else if (txtResumo.text == "") {
				msg += "Resumo";
				validacaoOk = false;
			} else if (txtTexto.text == "") {
				msg += "Texto";
				validacaoOk = false;
			} else if (cbxPublicacaoAtiva.selectedIndex == 0) {
				msg += "Ativar Publicação";
				validacaoOk = false;
			}
			
			msg += " é de preenchimento obrigatório.";
			
			if (!validacaoOk) {
				Alert.show(msg, "Erro!");
			}
			
			return validacaoOk;
		}
		
		private function okInclusao(event: CloseEvent): void {
			txtTitulo.setFocus();
			this.verticalScrollPosition = 0;
		}
		
		public function obterImagensPublicacao(): void {
			rm.obterImagensPublicacao(_vo);
		}
		
		private function resultObterImagensPublicacao(event: ResultEvent): void {
			
			listaImagensPublicacao = event.result.dados.lista;
			hbxImagens.removeAllChildren();
			var img: Imagem;
			contadorImagens = 0;
			
			for each (var vo: PublicacaoVO in listaImagensPublicacao) {
				img = new Imagem(vo, this);
				hbxImagens.addChild(img);
				contadorImagens++;
			}
			
			if (listaImagensPublicacao.length == 0) {
				var lblSemImagens: Label = new Label();
				lblSemImagens.setStyle("color", "red");
				lblSemImagens.text = "Não existem imagens cadastradas para esta publicação.";
				hbxImagens.addChild(lblSemImagens);
			}
		}
		
		private function uploadEvent(event:UploadEvent):void {
			Alert.show("Imagem enviada com sucesso.", "Aviso!");
			
			obterImagensPublicacao();
		}
		
		private function incluir(): void {
			vs.selectedChild = cnvDados;
			cbxTipoPublicacao.enabled = true;
			
			limparDados();
		}
		
		private function alterar(): void {
			
			vs.selectedChild = cnvDados;
			
			txtTitulo.actualText = _vo.tituloPublicacao;
			txtResumo.text = _vo.resumoPublicacao;
			txtTexto.text = _vo.textoPublicacao;
			
			selecionarOpcaoComboTipoPublicacao();
			selecionarOpcaoComboPublicacaoAtiva();
			
			cbxTipoPublicacao.enabled = false;
		}
		
		private function selecionarOpcaoComboTipoPublicacao(): void {
			
			for each (var obj: PublicacaoVO in cbxTipoPublicacao.dataProvider) {
				if (obj.idTipoPublicacao == _vo.idTipoPublicacao) {
					cbxTipoPublicacao.selectedItem = obj;
				}
			}
			
			verificarTipoPublicacaoSelecionado();
		}
		
		private function selecionarOpcaoComboPublicacaoAtiva(): void {
			
			for each (var obj: PublicacaoVO in cbxPublicacaoAtiva.dataProvider) {
				if (obj.bolAtivo == _vo.bolAtivo) {
					cbxPublicacaoAtiva.selectedItem = obj;
				}
			}
		}
		
		private function verificarTipoPublicacaoSelecionado(event: ListEvent = null): void {
			if (cbxTipoPublicacao.selectedIndex > 0 && cbxTipoPublicacao.selectedItem.descTipoPublicacao == TIPO_PUBLICACAO_SLIDES) {
				
				if (event != null) {
					Alert.show("Para cadastrar uma publicação como slide é necessário enviar uma " + 
							"imagem no tamanho de 590 x 250 pixels.", "Atenção!");
				}
				
				_qtdMaximaUploadImagens = 1;
				
			} else {
				_qtdMaximaUploadImagens = 2;
			}
		}

		public function set telaPai(telaPai: PublicacaoSelecao): void {
			_telaPai = telaPai;
		}
		
		public function get vo(): PublicacaoVO {
			return _vo;
		}
		
		public function get qtdMaximaUploadImagens(): int {
			return _qtdMaximaUploadImagens;
		}
	}
}